package br.com.sebrae.pr.sgp.services.impl;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;

import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;

import br.com.sebrae.pr.sgp.dao.UsuarioDAO;
import br.com.sebrae.pr.sgp.entities.Usuario;
import br.com.sebrae.pr.sgp.services.UsuarioServiceRemote;

import com.google.common.base.Preconditions;

@Stateless
@TransactionManagement(value = TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class UsuarioServiceImpl implements UsuarioServiceRemote {

    @EJB
    private UsuarioDAO usuarioDAO;

//    @EJB
//    private MailServiceRemote mailServiceRemote;

    public UsuarioServiceImpl() {
    }

    @Override
    public List<Usuario> efetuarPesquisa(final Usuario usuario) {
        return usuarioDAO.efetuarPesquisa(usuario);
    }

    @Override
    public Usuario pesquisarPorLogin(final String nmeLogin) {
        return usuarioDAO.pesquisarPorLogin(nmeLogin);
    }

    @Override
    public Usuario pesquisarPorLoginSenha(final String nmeLogin, final String desSenhaMd5) {
        Preconditions.checkArgument(StringUtils.isNotBlank(nmeLogin), "Login deve ser informado!");
        Preconditions.checkArgument(StringUtils.isNotBlank(desSenhaMd5), "Senha deve ser informada!");
        return usuarioDAO.pesquisarPorLoginSenha(nmeLogin, desSenhaMd5);
    }

    @Override
    public Usuario esqueciSenha(final Usuario usuario) {
        Preconditions.checkNotNull(usuario, "Usuario deve ser informado!");
        Preconditions.checkNotNull(usuario.getId(), "ID do usuario deve ser informado!");
//        Preconditions.checkArgument(StringUtils.isNotBlank(usuario.getDesEmail()), "Usuário não possui email cadastrado!");

        final String novaSenha = RandomStringUtils.randomAlphanumeric(8);

//        mailServiceRemote.notificarResetSenha(usuario, novaSenha);

//        usuario.setDesSenha(MD5.encode(novaSenha));
        usuarioDAO.salvarOuAtualizar(usuario);

        return usuario;
    }

    @Override
    public Usuario salvarOuAtualizar(final Usuario usuario) {
        Preconditions.checkNotNull(usuario, "Usuario deve ser informado!");
        Preconditions.checkNotNull(usuario.getId(), "ID do usuario deve ser informado!");
        return usuarioDAO.salvarOuAtualizar(usuario);
    }


}
